<?php

	class Database {
		
		private $aDate = "Date";
		private $detail = "Detail";
		private $id = "id";
		private $mysqli = NULL;
		private $passWord = "Password";
		private $topic = "Topic";
		private $userId = "UserId";
		private $userName = "Username";
		
		//Funktion som öppnar databasen.
		public function Connect(DBConfig $config) {
			
			$this->mysqli = new mysqli($config->host,
										$config->user,
										$config->pass,
										$config->db);
		
			//Om det inte gick att ansluta till databasen.								
			if ($this->mysqli->connect_error) {
				throw new Exception($this->mysqli->connect_error);
			}
			
			$this->mysqli->set_charset("utf8");
			
			return true;
		}
			
		//Förebereder en sql-fråga.
		public function Prepare($sql) {
			
			$ret = $this->mysqli->prepare($sql);
			
			if ($ret == false) {
				throw new Exception($this->mysqli->error);
			}
			
			return $ret;
		}
		
		//Funktion för att lägga till i databasen.
		public function Insert(mysqli_stmt $stmt) {
			
			if ($stmt->execute() == false) {
				throw new Exception($this->mysqli->error);
			}
			
			$ret = $stmt->insert_id;
			$stmt->close();
			
			return $ret;
		}
		
		//Kör alla sql-frågor.
		public function ExecuteIt($stmt) {
			if ($stmt->execute() == false) {
				throw new Exception($this->mysqli->error);
			}
			return $stmt;
		}

		//Funktion som tar bort från databasen.
		public function Delete(mysqli_stmt $stmt) {
			
			if ($stmt->execute() == false) {
				throw new Exception($this->mysqli->error);
			}
			
			$stmt->store_result();
			$stmt->close();
			
			return $stmt;
		}
		
		//Funktion som stänger databasen.
		public function Close() {
			return $this->mysqli->close();
		}
		
		//Funktion för testerna av databasen.
		public function Test(DBConfig $dbConfig) {
			
			$db = new Database();
			
			//Testar så att det går öppna databasen.
			if ($db->Connect($dbConfig) == false) {
				echo "Database connection failed.";
				return false;
			}
			
			//Testar så att det går lägga till i databasen.
			$query = $db->Prepare("SELECT Username, Password FROM TestTable");
			$stmt = $db->ExecuteIt($query);
			$stmt->store_result();
			$nrPostsBefore = $stmt->num_rows;
			$stmt->close();
			
			$stmt = $db->Prepare("INSERT INTO TestTable VALUES (null,'Tsting','Hejhej')");
			$db->Insert($stmt);
			
			$query = $db->Prepare("SELECT Username, Password FROM TestTable");
			$stmt = $db->ExecuteIt($query);
			$stmt->store_result();
			$nrPostsAfter = $stmt->num_rows;
			$stmt->close();
			
			if ($nrPostsBefore > $nrPostsAfter) {
				echo "Prepare or Insert failed.";
				return false;
			}
			
			//Testar så att det går att välja en användare från databasen.
			$querySelect = $db->Prepare("SELECT Username, Password FROM TestTable");
			$stmt = $db->ExecuteIt($querySelect);
			$stmt->store_result();
			$rows = $stmt->num_rows;
			$stmt->close();
			
			if ($rows == 1) {
				echo "Database SelectUser() failed.";
				return false;
			}
			
			//Testar så att det går radera användare
			$sql = "DELETE FROM TestTable WHERE Username = 'bajs'";
			$stmt = $db->Prepare($sql);
			$db->Delete($stmt);
			
			$delQuery = $db->Prepare("SELECT Username FROM TestTable WHERE Username = 'bajs'");
			$stmt = $db->ExecuteIt($delQuery);
			$stmt->store_result();
			$user = $stmt->num_rows;
			$stmt->close();
			
			if ($user == 1) {
				echo "Database Delete() failed.";
				return false;
			}
			
			//Testar att det går stänga databasen.
			if ($db->Close() == false) {
				Echo "Database Close() failed.";
				return false;
			}
			
			return true;
		}
	}
